package org.pidan.basic.multiThread;

/**
 * {@code @description}: Synchronized 锁
 * <p>
 * 本例为 实例方法
 * <p>
 * 实例方法上加synchronized，线程安全的前提是，多个线程操作的是同一个实例，如果多个线程作用于不同的实例，那么线程安全是无法保证的
 * 同一个实例的多个实例方法上有synchronized，这些方法都是互斥的，同一时间只允许一个线程操作同一个实例的其中的一个synchronized方法
 * <p>
 * {@code @author}: huangyuxin
 * {@code @date}: 2023-12-13
 */
public class SynchronizedShiLi {

    public int num = 0;

    public synchronized void add() {
        num++;
    }

    public static class T1 extends Thread {

        private SynchronizedShiLi shiLi;

        public T1(SynchronizedShiLi shiLi) {
            this.shiLi = shiLi;

        }

        @Override
        public void run() {
            for (int i = 0; i < 1000; i++) {
                this.shiLi.add();
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {

        SynchronizedShiLi shiLi = new SynchronizedShiLi();

        T1 t1 = new T1(shiLi);
        T1 t2 = new T1(shiLi);
        T1 t3 = new T1(shiLi);

        t1.start();
        t2.start();
        t3.start();

        // 等待三个线程结束
        t1.join();
        t2.join();
        t3.join();

        //输出结果
        System.out.println(shiLi.num);
    }

}
